Job Systemの作り方
リソース
CPUをフル活用するためのJob Systemの作り方について
メモ
Job Systemとは
タスクを分割して並列に処理するための仕組み
Job Systemの種類
Naïve Thread Pool
queueが一つで複数スレッドからdequeueして処理を行う
queueが一つしかないので複数スレッドからスレッドセーフにdequeueする必要がありあまりスケールしない
Local Job Buffers
スレッドがそれぞれにjob queueを持ち、そこからdequeueしてそれぞれ処理を行う
Naive Thread Poolとは違い、それぞれのスレッドがqueueを持っているので完全に独立してスレッドは処理が行える
一方で処理が重いタスクがあるスレッドのqueueに存在した場合、そのタスク以降にqueuingされているタスクの処理が進まなくて以降処理待ちが発生したりするので非効率
Stealing Jobs
Local Job Buffersのように各スレッドがjob queueを持ちそれぞれが完全に独立してタスクを処理する。
加えて自分のjob queueが空になったら詰まっているたのスレッドのjob queueからタスクを取ってきて(stealing)処理する。
Job Systemの構成要素
Job
タスク実行をするFunctionを保持するだけの塊。
Job Buffer
Push,Pop,Stealだけを持つbuffer。queueでもdequeでもない。
iteratorとか極力race conditionを起こす元になる要素を省く。
Head,Tail,Bufferの構造体で定義
TailはMutexを使うがHeadはスレッドセーフでなくて良い
HeadのPushとPopはシングルスレッドからだけの操作なので。逆にTailはStealで複数スレッドから使われるのでMutexでないといけない。それはそう。
Arcを使う
Arcは複数スレッドでMutexで排他制御を行う必要のあるオブジェクトの複数スレッドで共有するための機能
Job System
GlobalのJob Bufferなど。Startup, shutdown, logging and IO全部。
Job Future
Job Cell
Jobにmoveした参照はstaticのbufferからアクセスできないなどの所有権周りの問題どうするか
その他